package cn.rose.test;

/**
 * 
 */

import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

/**
 * <p>Title: 简易MailBean</p>
 * <p>Description: 提供简便的Mail发送功能（/p>
 * <p>Copyright: Copyright (c) 2003</p>
 * @version 1.0
 */

class ExtendString {
	public ExtendString() {
	}

	/**
	 去掉字符串两端的空白字符,并将字符串转化为中国的标准字符gb2312的字符串.
	 */
	public String CS(String str) { //去掉字符串2端的空白字符

		try {
			if (str == null)
				return "";
			str = str.trim();
			if (str == null)
				return "";
			str = new String(str.getBytes("8859_1"), "GBK");
		} catch (Exception e) {
			System.out.println(e);
		}
		return str;
	}
}

public class SendMail {
	private String errMsg = "";

	private ExtendString ExStr = new ExtendString();

	private String sender = "";//发件人地址

	private String smtpHost = "";//邮件发送服务器（smtp）
	
	private String smtpPort = "";//邮件发送服务器端口（port）

	private String user = ""; //登录用户名

	private String password = "";//登录密码

	private String subject = "";//mail主题
	
	final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

	public SendMail() {
		this.setPropertiesAttri();
	}

	private void setPropertiesAttri() {
		try {
			InputStream is = getClass().getResourceAsStream(
					"MailServer.properties");
			Properties prop = new Properties();
			prop.load(is);
			this.setSmtpHost(prop.get("SmtpHost").toString());
			this.setSmtpPort(prop.get("SmtpPort").toString());
			this.setUser(prop.get("User").toString());
			this.setPassword(prop.get("Password").toString());
			this.setSender(prop.get("Sender").toString());
			this.setSubject(ExStr.CS(prop.get("Subject").toString()));
		} catch (Exception ex) {
			System.err.println("ex1 in sendmail.java:" + ex.toString());
		}
	}

	/** 设置发件人地址 */

	public void setSender(String sender) {
		this.sender = sender;
	}

	public String getSender() {
		return sender;
	}

	/** 设置邮件发送服务器（smtp） */
	public void setSmtpHost(String smtpHost) {
		this.smtpHost = smtpHost;
	}

	public String getSmtpHost() {
		return smtpHost;
	}
	
	/** 设置邮件发送服务器端口（port） */

	public void setSmtpPort(String smtpPort) {
		this.smtpPort = smtpPort;
	}
	
	public String getSmtpPort() {
		return smtpPort;
	}

	/** 设置登录用户名 */
	public void setUser(String user) {
		this.user = user;
	}

	public String getUser() {
		return user;
	}

	/** 设置登录密码 */
	public void setPassword(String password) {
		this.password = password;
	}

	public String getPassword() {
		return password;
	}

	/** 设置mail主题 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getSubject() {
		return subject;
	}

	/**
	 * 使用smtp发送邮件 主程序
	 * @throws MessagingException mail发送失败
	 */
	public void smtp(String receiver, String content) throws MessagingException {
		if (smtpHost == null)
			throw new MessagingException("smtpHost not found");
		if (user == null)
			throw new MessagingException("user not found");
		if (password == null)
			throw new MessagingException("password not found");

		Properties properties = new Properties();
		properties.put("mail.smtp.host", smtpHost);//设置smtp主机

		properties.put("mail.smtp.auth", "true");//使用smtp身份验证
		
		if(smtpPort != null && !"".equals(smtpPort))
		{
			properties.put("mail.smtp.port", smtpPort);//设置smtp主机端口
			
			properties.put("mail.smtp.socketFactory.class",SSL_FACTORY);
			properties.put("mail.smtp.socketFactory.fallback","false");
			properties.put("mail.smtp.socketFactory.port", smtpPort);
		}

		Session session = Session.getInstance(properties,
				new Authenticator() {
					public PasswordAuthentication getPasswordAuthentication() {
						return new PasswordAuthentication(user, password);
					}
				});
		

		//获得邮件会话对象
		MimeMessage mimeMsg = new MimeMessage(session);//创建MIME邮件对象

		if (sender != null)//设置发件人地址
		{
			mimeMsg.setFrom(new InternetAddress(sender));
		}
		
		if (receiver != null)//设置收件人地址
		{
			mimeMsg.setRecipients(Message.RecipientType.TO, parse(receiver));
		}
		
		if (subject != null)//设置邮件主题
		{
			mimeMsg.setSubject(subject, "GBK");
		}
		
		MimeBodyPart part = new MimeBodyPart();//mail内容部分

		part.setText(content == null ? "" : content, "GBK");

		//设置邮件格式为html cqc
		part.setContent(content.toString(), "text/html;charset=GBK");
		Multipart multipart = new MimeMultipart();
		multipart.addBodyPart(part);//在 Multipart 中增加mail内容部分

		mimeMsg.setContent(multipart);//增加 Multipart 到信息体

		mimeMsg.setSentDate(new Date());//设置发送日期

		Transport.send(mimeMsg);//发送邮件
	}

	/** 解析地址集合字符串 */
	private InternetAddress[] parse(String addressSet) throws AddressException {
		ArrayList list = new ArrayList();
		StringTokenizer tokens = new StringTokenizer(addressSet, ";");
		while (tokens.hasMoreTokens()) {
			list.add(new InternetAddress(tokens.nextToken().trim()));
		}
		InternetAddress[] addressArray = new InternetAddress[list.size()];
		list.toArray(addressArray);
		return addressArray;
	}

	//供外部调用的接口 edit by rose 2010-06-23 修改邮件发送失败抛出异常时候 返回false
	public boolean sendMails(String mail, String content) {
		boolean flag = false;
		int mailLen = 0;
		int contentLen = 0;
		if (mail == null || content == null) {
			return flag;
		}
		try {
			this.smtp(mail, content);
			flag = true;
		} catch (Exception ex) {
			flag = false;
			System.err.println("ex2 in sendmail.java:" + ex.toString());
		}
		return flag;
	}
	
	public static void main(String[] args) {
		SendMail mail = new SendMail();
		String email = "qiny.y.qin@oyesgo.com";
		String content = "账号:123 密码:123 <br/>感谢您您使用OSS!<br/><a href='http://www.xxxx.com.cn' target='_blank'>点击OSS入口点</a><br/>此致<br/>即日";
		try {
			mail.setSubject("OSS对应权限");
			mail.sendMails(email, content);
			System.out.println("成功");
		} catch (Exception ex) {
			System.err.println("ex33:" + ex.getMessage());
		}
	}
}
